T-워크로드 템플릿에 없는 파드를 포착한다면
개요
디플로이먼트의 기본 사용법은 라벨 셀렉터와 템플릿의 라벨을 일치시켜 작성하는 것이다.
그런데 만약.. 셀렉터가 너무 범용적으로 작성되었다면 어떤 일이 발생할까?
그래서 한 컨트롤러가 관리하고 있는 파드들에 다른 컨트롤러가 개입되는 상황이 생긴다면..?
가령 이미 존재하고 있는 셀렉터와 같은 셀렉터를 사용했거나 하는 상황 말이다.
설정
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: default
name: default
spec:
replicas: 3
selector:
matchLabels:
app: default
template:
metadata:
labels:
app: default
spec:
containers:
- image: nginx:latest
name: nginx
이 상태에서 같은 라벨에 대해 셀렉터를 부여할 것이다.
같은 라벨을 가진 파드가 이미 존재할 때
apiVersion: v1
kind: Pod
metadata:
name: "orphan"
namespace: default
labels:
app: default
spec:
containers:
- name: myapp
image: "nginx:latest"
ports:
- containerPort: 80
name: http
라벨에 app:default
가 있는 일반 파드를 만든다.
디플은 정상적으로 파드들을 만들어냈다.
edit으로 하나를 줄이는 식으로 수정해도 잘 작동한다.
이건 rollout에 추적이 되지 않으니 다른 방법을 사용해보자.
이번에는 이미지를 변경했다. 잘만 추적한다.
음.. 뒤돌려도 잘만 된다.
버전 추적도 잘 되는데..?
아무런 영향도 없이..
단순 파드로는 그다지 영향이 없는 것일지도 모르겠다.
다른 워크로드가 같은 라벨로 포착하고 있다면?
그럼 같은 워크로드면 어쩔래..?
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: another
name: another
spec:
replicas: 3
selector:
matchLabels:
app: default
template:
metadata:
labels:
app: default
spec:
containers:
- image: nginx:latest
name: nginx
이름만 다르고 똑같이 생긴 디플로이먼트이다.
안 헷갈리게 디플 라벨도 바꿨어야 했는데, 아무튼 app:default
를 셀렉터로 하는 다른 디플이 있다!
일단 시작은 너무 잘 돼버리고~
일단, 개수랑 이미지를 바꿨는데도 추적이 잘 된다.
undo를 해봤는데, 원래대로 돌아가지 않는다.
undo할 때 개수 조절이 잘 안 되는 건 원래 그런 거라 사실 큰 상관이 없어보인다.
실험해본 사항은 다음과 같다.
- 이미지 단순 바꾸기
- 아무런 이상 없음
- 개수 바꾸기
- 애초에 추적도 안 되는 듯
- 이미 다른 디플이 관리하고 있는 상태와 달랐던 상태에서 똑같이 업데이트 하기
- 그래도 문제 없다.
이렇게 다 문제가 없어버리면 언제 문제가 생긴다고 봐야 하는 거냐?
레플리카셋으로 테스트하기
레플리카셋 문서를 읽다가 알게 된 것이다.
디플로이먼트로 실험할 때는 분명 셀렉터 이슈가 없는 것을 포착했다.
그러나 레플리카셋을 만들어서 올리면 그때는 문제가 발생한다.
orphan 파드에 자동으로 ownerReference
필드가 생기면서 레플이 추적하는 파드가 되어버렸다.
원인 분석
새로운 사실을 알 수 있었다.
디플로이먼트로 만들어지는 레플리카셋과 파드는 라벨로 pod-template-hash
라는 값까지 가지게 된다.
아무래도 디플로이먼트는 여러 개의 레플리카셋을 가질 수 있다보니, 각 레플을 관리하기 위해 자체적으로 새로운 라벨을 추가하는 모양이다.
그래서 여태 디플로이먼트를 사용할 때는 같은 라벨을 가진 파드가 있다고 해도, 셀렉터로 추적이 되지 않았던 것이다.
보다시피 저 라벨을 붙여버리니 바로 기존에 존재하던 레플이 관리하던 파드가 하나 사라져버렸다.
결론
디플로이먼트와 같이, 흔히 사용하는 워크로드들은 레플리카셋을 둘 때 pod-template-hash
라는 추가 라벨을 붙여준다.
그래서 템플릿만 봤을 때는 같은 라벨을 가진 다른 리소스가 있더라도 실상 문제가 발생하진 않는다.
그럴 일은 거의 없겠으나, 직접 레플리카셋을 만들어 사용하는 사람이 있다면 이 문제를 매우 유념해야 할 것이다.